import time

from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
from apscheduler.schedulers import base

from tools.mybackground import MyBackgroundScheduler

class MyScheduler():

    # 定义静态变量实例
    backgroundScheduler = MyBackgroundScheduler()  # 非阻塞的方式

    @staticmethod
    def start(*args, **kwargs):
        if MyScheduler.backgroundScheduler.state == base.STATE_STOPPED:
            MyScheduler.backgroundScheduler.start(*args,**kwargs)

    @staticmethod
    def shutdown(*args, **kwargs):
        if MyScheduler.backgroundScheduler.state == base.STATE_RUNNING:
            MyScheduler.backgroundScheduler.shutdown(*args, **kwargs)

    @staticmethod
    def pause():
        if MyScheduler.backgroundScheduler.state == base.STATE_RUNNING:
            MyScheduler.backgroundScheduler.pause()

    @staticmethod
    def resume():
        if MyScheduler.backgroundScheduler.state == base.STATE_PAUSED:
            MyScheduler.backgroundScheduler.resume()


class SchedulerTest():

    list = [5]

    def my_job1(self, a):
        print("a:" + a)
        self.list[0] -= 1
        time.sleep(5)
        print("job1,time:{0},{1}".format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), self.list[0]))

    def my_job2(self, a, b):
        # print("a:" + a + " b:" + b)
        time.sleep(1)
        print("job2:" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))

    def my_listener(self,event):
        if event.exception:
            print('The job crashed :(')
        else:
            print('The job worked :)')

    def sched_start(self):

        # max_instances：同一个任务在线程池中最多跑的实例数。
        # coalesce：累计的任务是否执行。True不执行，False, 执行。
        # misfire_grace_time：超过用户设定的时间范围外，该任务依旧执行的时间(单位时间s)。
        # 比如用户设置misfire_grace_time = 60, 于3:00触发任务。由于某种原因在3: 00没有触发，被延时了。如果时间在3: 01内，该任务仍能触发，超过3: 01任务不执行。
        MyScheduler.backgroundScheduler.add_job(self.my_job1, 'cron', second='*/2', args=['1'], id="my_job1", max_instances=3)
        # 监听
        MyScheduler.backgroundScheduler.add_listener(self.my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)

        MyScheduler.start()  # 有且只能调一次

        # 增加任务 必须先暂停
        MyScheduler.pause()
        MyScheduler.backgroundScheduler.add_job(self.my_job2, 'cron', second='*/2', args=['2','3'],id="my_job2")
        MyScheduler.resume()

        MyScheduler.start() # 有且只能调一次

        print('end1!')


if __name__ == '__main__':

    myscheduler1 = SchedulerTest()
    myscheduler1.sched_start();  # 这里的调度任务是独立的一个线程

    print('end!')

    while True:
        time.sleep(2)  # 其他任务是独立的线程执行
        print('sleep!')